// jwt是当前最流行的跨域认证解决方案

// jwt格式：Headers.Payload.Signature
//     header：安全性
//     payload：真正的用户信息，加密后的字符串
//     signature：安全性
// 服务端认证通过后,返回token,客户端存储于storage,请求的时候放在header里: Authorization: Bearer <token>

// jwt使用: npm i jsonwebtoken express-jwt

const express = require('express')
const jwToken = require('jsonwebtoken')
// const { expressJWT: expressJWT } = require('express-jwt')
const { expressjwt: jwt } = require("express-jwt")


const app = express()

const secretKey = '!@!$#!@$%%@aqqeqwtqtg'


// 生成jwt:
// jwt.sign({ "username": "123" }, secretKey, { expiresIn: '30m' })


// 将jwt还原成json: unless可以排除不需要jwt的接口路径
// app.use(expressJWT({ secret: secretKey , algorithms: ['HS256']}).unless({ path: [/^\/api\//] }))
app.use(
    jwt({
        secret: secretKey,
        algorithms: ["HS256"],
    }).unless({ path: ["/api/login"] })
)

// 解析json格式数据，json解析中间件
app.use(express.json())


app.get('/admin/userInfo', (req, resp) => {
    // 直接默认解析到jst的payload
    console.log(req.auth)

    resp.send({
        data: req.auth.username
    })

})


app.post('/api/login', (req, resp) => {

    console.log(req.body)

    if (req.body.username !== 'admin' || req.body.password !== '000000') {
        return resp.send({
            status: 1,
            msg: '登陆失败'
        })
    }

    const token = jwToken.sign({ "username": req.body.username }, secretKey, { expiresIn: '30m' })

    return resp.send({
        status: 0,
        msg: '登陆成功',
        data: token
    })
})

// 全局异常处理
app.use((err, req, resp, next) => {
    if (err.name === 'UnauthorizedError') {
        return resp.send({
            status: 401,
            msg: '鉴权失败'
        })
    }

    resp.send({
        status: 500,
        msg: '服务器出错'
    })
})



app.listen(80, () => {
    console.log('express server running: http://127.0.0.1')
})